/*
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.losalpes.persistence;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * Clase de persistencia para relacionarse con la base de datos
 * @author Henry.Quiroga
 */
@Stateless
public class PersistenceServices implements IPersistenceServices {

    @PersistenceContext
    private EntityManager em;

    /**
     *Constructor de la clase
     */
    public PersistenceServices() {
    }

    /**
     * Permite crear un objeto nuevo
     * @param obj el objeto a insertar
     */
    public void create(Object obj) {
        em.persist(obj);
    }

    /**
     * Permite actualizar un objeto de la base de datos
     * @param obj
     */
    public void update(Object obj) {
        em.merge(obj);
    }

    /**
     * Permite eliminar un objeto de la base de datos
     * @param obj
     */
    public void delete(Object obj) {
        em.remove(em.merge(obj));
    }

    /**
     * Lista todos los elementos de una lista
     * @param c: Nombre de la clase
     * @return una lista con todos los elementos de la lista
     */
    public List findAll(Class c) {
        return em.createQuery("select O from " + c.getSimpleName() + " as O").getResultList();
    }

    /**
     * Busca un elemento Id de la lista
     * @param c: Nombre de la clase
     * @return una lista con todos los elementos de la lista
     */
    public Object findById(Class c, Object id) {
        return em.find(c, id);
    }

    /**
     * Busca elementos de la lista basados en una consulta y en una serie de parametros
     * @param sql: sentencia a ejecutar
     * @param parametros: lista de parametros a usar en la consulta
     * @return una lista de coincidencias
     */
    public List findQuery(String sql, List<String> parametrosNombre, List<Object> parametrosValor) {
        Query query = em.createQuery(sql);
        for(int i=0; i<parametrosNombre.size(); i++)
            query = query.setParameter(parametrosNombre.get(i),  parametrosValor.get(i));
        
        return query.getResultList();
    }

    /**
     * Busca elementos de la lista basados en una consulta y en un parametro
     * @param sql: sentencia a ejecutar
     * @param parametros: lista de parametros a usar en la consulta
     * @return una lista de coincidencias
     */
    public List findQuery(String sql, String parametroNombre, Object parametroValor) {
        Query query = em.createQuery(sql);
        query = query.setParameter(parametroNombre,  parametroValor);

        return query.getResultList();
    }

    /**
     * Busca elementos de la lista basados en una consulta sin parametros
     * @return una lista de coincidencias
     */
    public List findQuery(String sql) {
        Query query = em.createQuery(sql);

        return query.getResultList();
    }
}
